# 有些页面只有登陆后才可以访问，而且登录后可以连续访问很多次网站，但是过一段时间就需要重新登录
# 还有些网站，在打开浏览器时就自动登录了，且很长时间都不会失效

# 1.静态网页和动态网页:
<!DOCTYPE html>
<html>
  <head>
    <title>2.2.2_网页结构.html</title>
	    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
   <div id="container">
   <div class="wrapper">
   <h2 class="title">Hello World</h2>
   <p class="text">Hello, this is a paragraph.</p>
   </div></div>
  </body>
</html>
# 这是最基本的HTML代码，将其保存为一个.html文件，放在某台具有固定公网IP的主机上，主机上装上Apache或Nginx等服务器，这台主机就
# 可以作为服务器了，其他人便可以通过访问服务器看到这个页面，搭建了一个最简单的网站
# 静态网站：内容是HTML代码编写的，文字、图片等内容均通过写好的HTML代码来指定；加载速度快，编写简单，可维护性差，不能根据URL
# 灵活多变地显示内容，如想给这个网页传入一个name参数，让其在网页中显示出来，是无法做到的。

# 动态网站：可动态解析URL中参数的变化，关联数据库并动态呈现不同的页面内容，非常灵活多变，现在遇到的大多数网站都是动态网站，
# 不再是一个简单的HTML，可能是由JSP、PHP、Python等语言编写的
# 动态网站还可以实现用户登录和注册的功能。输入用户名和密码登录后，得到的凭证就是会话和Cookies共同产生的结果

# 2.无状态HTTP：HTTP协议对事务处理是没有记忆能力的，服务器不知道客户端是什么状态。
# 向服务器发送请求后，服务器解析此请求，返回对应的响应，服务器副车完成此过程，且此过程是完全独立的，服务器不会记录前后转态的变化
# 也就是缺少转态记录，意味着后续需要处理前面的信息，必须重传，导致需要额外传递一些前面的重复请求，才能获取后续响应，此效果不理想
# 为了保持前后状态，可定不能将前面的请求全部重传一次，太浪费资源了，对于需要用户登录的页面来说，更是棘手
# 会话和Cookies：用于保持HTTP连接状态的技术出现了。会话在网站的服务器，用来保存用户的会话信息；Cookies在客户端，浏览器在下次
# 访问网页时会自动附带上它发送给服务器，服务器通过识别Cookies来鉴定出哪个用户，再判断用户是否是登录状态，返回对应的响应。
# 可理解为Cookies里保存了登录的凭证，有了它，只需在下次请求携带Cookies发送请求而不必重新输入用户名、密码等信息登录了。
# 在爬虫中，有时处理需要登录才能访问的页面时，一般会直接将登陆成功后获取的Cookies放在请求头里直接请求，而不用重新模拟登录

# 1>会话：指有始有终的一系列动作/消息；Web中，会话对象用来存储特定用户会话所需的属性及配置信息，当用户在应用程序的Web页间跳转时
# 存储在会话对象中的变量将不会丢失，而是在整个用户会话中一直存在下去，当用户请求来自应用程序的Web页时，如果该用户还没有会话，Web
# 服务器将自动创建一个会话对象。当会话过期或被放弃后，服务器将终止该会话。

# 2>Cookies:网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据
#   A.会话维持：利用Cookies保持状态，当客户端第一次请求服务器时，服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端，
#       用来标记是哪一个用户，客户端浏览器会把Cookies保存起来。当浏览器下一次再请求该网站时，浏览器会把此Cookies放到
#       请求头一起提交给服务器，Cookies携带了会话ID信息，服务器检查该Cookies即可找到对应的会话是什么，再判断会话来辨认用户状态
#   成功登录某个网站时，服务器会告诉客户端设置哪些Cookies信息，在后续访问页面时客户端会把Cookies发送给服务器，服务器再找到对应
#       的会话加以判断。
#   如果会话中的某些设置登录状态的变量是有效的，那就证明用户处于登录状态，此时返回登录之后才可以查看的网页内容，
#       浏览器再进行解析便可看到了
#   如果传给服务器的Cookies是无效的，或者会话已经过期了，将不能继续访问页面，此时会收到错误响应或跳转到登录页面重新登录。
#   Cookies和会话需要配合，一个处于客户端，一个处于服务端，二者共同协作，实现了登录会话控制

#   B.属性结构：以知乎为例，看看Cookies有哪些内容：
#   F12中打开Application选项卡，左侧Storage部分，最后一项即为Cookies，有很多条目，每个条目可以称为Cookie，有如下属性：
#   Name: 该Cookie名称，一旦创建，该名称便不可更改
#   Value： 该Cookie值，如果值为Unicode字符，需要为字符编码。如果值为二进制数据，则需要使用BASE64编码
#   Domain：可访问该Cookie的域名，如果设置为.zhihu.com，则所有以zhihu.com结尾的域名都可访问该Cookie
#   Max Age: 该Cookie失效的实现，单位为秒，常和Expires一起使用，通过它可以计算出有效时间，如果为整数，则该Cookies在Max Age后
#            失效，如果为负数，则关闭浏览器时Cookie即失效，浏览器也不会以任何形式保存该Cookie
#   Path： 该Cookie的使用路径。如果设置为/path/，则只有路径为/path/的页面可以访问该Cookie。如果设置为/，则本域名下所有页面，
#           都可以访问该Cookie
#   Size字段：此Cookie的大小
#   HTTP字段：Cookie的httponly属性。此属性为true，则只有在HTTP头中会带有此Cookie的信息，而不能通过document.cookie来访问
#   Secure：该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等，在网络上传输数据前将数据加密，默认false

#   C.会话Cookie和持久Cookie
#   会话Cookie：就是吧Cookie放在浏览器内存里，浏览器关闭后该Cookie即失效
#   持久Cookie：会保存到客户端的硬盘中，下次还可以继续使用，用于长久保持用户登录状态
#   严格来说，没有会话和持久之分，只是由Cookie的Max Age或Expires字段决定了过期的时间，因此，一些持久化登录的网站其实就是把
#       Cookie的有效时间和会话有效期设置得比较长，下次再访问页面时仍然携带之前的Cookie，就可以直接保持登录状态。

# 3.常见误区：
# 会话机制的误解：“只要关闭浏览器，会话就消失了”，除非程序通知服务器删除一个会话，否知服务器会一直保留。如程序一般都是在注销后
# 才去删除会话
# 但当关闭浏览器时，浏览器不会主动在关闭之前通知服务器它将要关闭，所以服务器根本不会有机会知道浏览器已经关闭。之所以有这种错觉，
# 是因为大部分会话机制都使用会话Cookie来保存会话ID信息，关闭浏览器后Cookies就消失了，再次连接服务器时，也就无法找到原来的会话了
# 如果服务器设置的Cookies保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求头，把原来的Cookies发送给服务器，则再次打开
# 浏览器，仍然能够找到原来的会话ID，依旧还是可以保持登录状态的。
# 关闭浏览器不会导致会话被删除，就需要服务器为会话设置一个失效时间，当距离客户端上一次使用会话的时间超过这个失效时间时，服务器就
# 可以任务客户端已经停止了活动，才会把会话删除以节省存储空间。